Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим) nvc123:
Ошибка при работе с MdlVis. Попробуй открыть модель в версии 1.40, там должно изменение видимости в ключевых кадрах должно заработать. Однако советую сделать копию модели, т.к. 1.40, если не изменяет память, ломает уже настроенную видимость.
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
Насколько я понял, тебе нужно просто сменить текстуру. Для этого тебе по меньшей мере нужна текстура. Можно взять либо стандартную, либо создать самому (что довольно просто, если знать как).
Чтобы создать текстуру, возьми любое изображение, открой его в ФШ и сохрани как tga 32 бит с размером до 512х512 (вроде бы можно делать любой размер, не превышающий 1024х768, но я советую сохранять пропорции и делать размер не больше 512х512, или кратных половине этого числа (256/128/64/32) , за тем открой в War3 Image Extractor и переведи формат tga в blp. Потом открываешь модельку - редактор текстур и переименовываешь нужную текстуру в ту которая тебе нужна (они должны быть в одной папке) жмешь - Enter - .
ClotPh, Герой беру с проверкой тип героя. Но возврашает 0 даже расчет бонус атака от статы тоже фаталит 0_о
Извиняюсь это моя ошибка то что я его не сохранил unit в структуру а то получал пустой юнит...
RMem/WMem - вторая версия, есть еще третья и, скорее всего, последняя
function SetAbilityStringParam2 takes integer id, integer off, string newVal, integer lvl returns boolean
local integer k=GetAbilityUIDefCaching(id)
if k < 1 then
return false
endif
set k=k+off
set k=RMem(k)
if k>0 then
set k=k+lvl*4-4
call AddNewOffsetToRestoreFast(k)
call WMem(k,GetStringAddress(newVal))
return true
endif
return false
endfunction
ИИ стандартный, полагаю? Стандартному ИИ вроде как вижн не важен, он и так знает где все находятся, если мне не изменяет память. Как от него не прячься, найдет сразу. Если уж очень хочется - давать юнитов нейтралам и делать их союзным всем ботам. (игроков 16, если не изменяет память). Или давать союзным игрокам, при наличии. По крайней мере не будут мчаться в след за армией. Однако вполне могут быть более качественные решения проблемы, я стандартный ИИ не изучал, не могу быть уверен в офигительности предложенного решения. :)
К сожалению, таким способом будут работать только башни, улучшенные до Башни Стрелка во время игры. Если изначально на карте стоят Башни Стрелки, они работать не будут. Если надо могу исправить.
Исправил. Теперь Башни Стрелки, поставленные на карту в редакторе будут работать так же, как те, что были улучшены во время игры.
незнаю поможет или нет но пробни через кустом скрипт написать это AddUnitAnimationProperties(u, "Alternate", false)
где u - это твой юнит и советую перед ней поставить паузу тригера на 0.1 хотяб
koloff:
Объявляются переменные в начале.
local lightning l
call AddLightningEx(codeName, true, GetLocationX(where1), GetLocationY(where1), GetLocationZ(where1), GetLocationX(where2), GetLocationY(where2), GetLocationZ(where2))
set l = bj_lastCreatedLightning
Ну карта защищена от ковырялкиных, весь код нужно править.
Да и вовсе понадобится JNGP чтобы сохранить изменения в этой карте.
Карта защищена довольно примитивно, если вы не смогли её запустить - вам явно не стоит этим заниматся.
Если во всех картах одинаковый id, значит покопайся в хеше.
Это как, можно в личку?
Проблему решил, переделав стандартную способность, а не создавая нестандартную. Это почти что панацея от подобных случаев, когда id (ещё называют raw-code) способности меняется.
Уничтожая эффект, ты заставляешь его проигрывать анимацию Death. Если у эффекта только 1 анимация, будет проиграна эта единственная анимация. Если анимаций несколько, но нет анимации Death, эффект просто исчезнет.
Diaboliko, я тебе и говою, сразу модель кучки спецэффектов, модель огоньков на земле, где их штук 20. Видел такую модель в доте, там еще зачем то модель на 5 огоньков.
Для тебя самый простой способ: Получает предмет, добавить способность пассивную, которая имеет модель оружия, а когда теряет этот предмет, удалить способность.
function check takes nothing returns boolean
local unit u = GetFilterUnit()
local player p = GetOwningPlayer(caster)
local real coneAngle = TransferDegrees(bj_RADTODEG * Atan2(GetUnitY(u) - GetUnitY(caster), GetUnitX(u) - GetUnitX(caster)))
local real sector = 30
local boolean answer = u != caster and IsUnitEnemy(u, p) and IsUnitVisible(u, p) and IsUnitAliveBJ(u) and GetUnitFacing(caster) - coneAngle <= sector and GetUnitFacing(caster) - coneAngle >= sector - sector*2
set u = null
set p = null // игрока можно не обнулять, их всё же очень конечное количество.
return answer
endfunction
На кол-во handles это никак не повлияло.
Потому что никто из твоих FilterUnit() не был убран из игры. Без обнуления после удаления юнита хэндл бы остался, а с обнулением, был бы освобождён для нового использования.
У них стандартное время смерти 5 секунд, смотри игровые константы.
Поставь в игровых константах Decay Time - Effects время меньше, но не очень маленькое, а то анимация смерти эффекта проигрываться не будет.
Чтобы не плодить переменные эффекта, сделай такие функции:
function CreateEffectPoint takes string s, real x, real y returns nothing
call DestroyEffect(AddSpecialEffect(s, x, y))
endfunction
function CreateEffectTarget takes string s, widget w, string att returns nothing
call DestroyEffect(AddSpecialEffectTarget(s, w, att))
endfunction
Во время сохранения при включённой оптимизации кода и выключенном режиме дебага эти 2 функции будут "раскрыты", и в конечном коде будут только DestroyEffect(AddSpecialEffectTarget(...)). У Inline оптимизации есть некоторые требования для передаваемых параметров, потому функции не в некоторых случаях не будут "раскрыты".
когда игроки подгрузили данные из прелоада и синхронизировали их то устанавливаем им флаг загрузил
а потом просто сохраняем всё что надо у тех у кого нету флага
подробнее в статье про прелоад
данные надо синхронить со всеми иначе десинк
Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )
не правильно
ты обнулил переменную а потом удалил точку которая в переменной
а так как переменная пустая то ты ничего не удалил
и локалку плохо юзаеш
лучше
local location l=GetUnitLoc(GetTriggerUnit())
так сразу занесёшь в неё позицию юнита который вошёл в область
короче удели хотяб пол часа на это, это , это и вот это
quq_CCCP, Ну я на хайве видел полуджассовый вампиризм. Так мне и нужно вручать при замахе, чтоб если героя диспелят он вампиризм при атаке вернул. А утечку показывает, как я атакую, сразу хендл на один повышается. Может руна не удаляется? ClotPh, Вообще не понял о чём ты.
Решил проблему, утечка возникала из -за не удаления руны, она почему-то не удаляется изнутри триггера, создал отдельный для удаления и нет утечки.
Видимо, cJass интерпретатор не всегда верно интерпретирует код, написанный на vJass.
Есть такое, статик ифы и модули не всегда корректно работают. Можно использовать !nocjass и !endnocjass насколько я помню. Если не выйдет - статик ифы заменяются на #if сжасса.
Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
static method mymethod takes nothing returns nothing
call BJDebugMsg("this works")
endmethod
endstruct
function myfunction takes nothing returns nothing
call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility
call OnAbilityCast('A000',mystruct.mymethod.name)
//for example, caster system's OnAbilityCast, requires a function name
endfunction
Создай новый триггер
событие- Боевая единица входит в нужную область (A Units enters MYREGION)
условие - Боевая единица - Мой Герой (Unittype или Unit Comparison /+ Player comparison)
действие - Победа (Игра-Victory)
Предварительно создай область MYREGION
PT153:
Вспомнил про один баг. Есть сделать PauseTimer() на периодический таймер, а потом на этой таймер использовать ResumeTimer(), то таймер повторит свой цикл лишь раз, а потом остановится.
сам не пользуюсь ResumeTimer, но щас проверил, действительно не работает что-то. Видимо, это работает только тогда, когда таймер не до конца дошел.
можно обойтись и без ResumeTimer
понимаю, ты хочешь сделать какое-то ограничение после возвращения урона. Спустя 3 секунды возвратка может снова возвращать урон.
Можно было сделать по-другому.
Еще не понимаю, зачем нам нужен периодический таймер.
можем логическую переменную b завести и таймер t
нанес противник урон = проверяем логическую переменную, если истина, запускаем одноразовый таймер, и ставим ложь в логической переменной = false
if b then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.?mdl",u,"origin"))
call UnitDamageTarget(udg_u,u,r*5,false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
call BJDebugMsg("Reflected:"+R2S(r*5))
call TimerStart(udg_t,0.5,false,function t3a)
set b = false
endif
когда таймер запустится
function t3a takes nothing returns nothing
call PauseTimer(udg_t)
set b = true
endfunction
думаю все что надо это call ResumeTimer() заменить на call TimerStart()
Я всегда детектил вход юнита на карту,
проверяя на то что этот юнит является иллюзией,
как написано было выше.
При этом чтобы отлавливать иллюзий от определённых скиллов, а не всех подряд - можно проверять их на текущий бафф (все иллюзии имеют бафф призыва, у каждого такого скилла его можно поставить свой). Эта фишка помогла мне сделать аналог героя из DotA - Phantom Lancer (старый), пассивная способность создавала при атаке свои копии, которая работала изначально только при атаках самого героя, а ульт добавлял по-уровням возможность создавать копии этими же копиями (только копиям от пассивки), потом копиям от всех его способностей (копьё и инвиз), и в конце - вообще от любых его копий (манта, ульт морфа, 1-е скиллы ШД и террора).
Вот условие на проверку баффа. Но тут может быть проблема, если у тебя есть станящие способности, которые используют не этот бафф.
Но мой способ, предложенный выше, также должен работать, причём независимо от того, какой станящий бафф наложен.
function AddLocalEffect takes string eff, unit u,player p,string a returns effect
if not IsPlayerAlly(GetLocalPlayer(),p) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
set eff = " "
endif
return AddSpecialEffectTarget(eff,u,a)
endfunction
неохота качать JNGP чтоб твой код тестить, заюзай эту функцию
Ну как насчет способности "Напрудить на автора карты""
Правда это очень сложная способность, потребуется мемхак и знания jass, чтобы автор мог узнать от то что о нем думают игроки в любое время...
А как насчёт способности Жатва Душ и ещё способности - Великое поглощение м?
Это не такие уж сложные способности, зато очень полезные и нужные, Великое поглощение вытягивает из наглого выскочки всю жизненную энергию в мой меч а после Жатва Душ поглощает душу выскочки в мой меч навеки, эти два заклинания становятся хорошим уроком и карой всем тем, кто смеет в реале жить по законам технологий и бросать вызов Королю Лордерона, тобишь мне.
Вот очень хорошие способности, хочешь их испробовать? biridius:
На самом деле jass это триггеры без картиночек слева. С jngp там даже есть быстрый ввод/подстановка функций и цветной текст
сделай стандартную Грозу: магией воды же вызывается туча
Нет, гроза это шаманизм. Шаман взывает к силам природы и появляется грозовое облако. Гидромант это не может A.W.K.:
Вот: Заклинание "Ледяное дыхание"
Можно заменить название на "Конус Холода" (Подходит, да и в WoW это заклинание есть у мага)
Наносит урон по площади а затем жертвы получают периодический урон от обморожения.
Нет спасибо это не надо. Эту способностью я синим драконам отдал, уже не нужен совет, я сделал способность для Гидроманта: Гнев Волн
Это кастовая способность когда он подобно повелителю зверей вызывающему стадо ящерец, гидромант вызывает кучу волн которые наносятся. Вот я нашёл решение, как тебе такая способность для гидроманта?
Воу... Джаз не обязательно изучать, всё это можно сделать и на ГУИ, тем более такую простую способность. На этом сайте есть тема "Заклинания на заказ". Заказывай, жди, получай, изучай. Если прям горит, могу сделать для тебя сам.
И в чём смысл делать глобалку, а не просто писать тогда уж сразу GetFilterUnit( )
Я сдеал локалку, чтобы вместо GetFilterUnit( ) писать то, что мне нужно, в данном случае CLONE quq_CCCP:
Потом клонов от способностей ищут не так,
Да так и я их могу найти
Точнее не совсем так, я их искал через Юнит входит в Область ( Игровая зона )
Но искать их в другом триггере и сдругим событием мне нафиг не нужно.
Мне нужно найти иллюзии сразу в триггере со способностью, чтобы потом не было геморроя
========================
И ещё раз повторюсь, что при повторном использовании способности, 2 прошлые иллюзии (да и вообще в принципе если рядом с гером будут другое любое ко-во иллюзий) перемещаются к противнику. Но две новосозданные остаются на месте.
Так же повторюсь, что когда проверка была IsUnitIllusion == false, то иллюзии определяло как не иллюзии!
Все кто пытались помочь, похоже проигнорировали это замечание...
========================
Мой вывод таков: Иллюзиям, призванным через стандартную Способность (Предмет: Иллюзии) присваивается статус иллюзий слегка позже, чем происходит проверка.
С другой стороны, скорее всего это может и можно как-то обойти, ведь есть карты примеры, где подобное работает нужным образом.
О том, как устроены чёртовы способности близов стоит только догадываться =\
К счастью Способность (Предмет: Иллюзии) не наносит 0.00 урона, и за это близам огромное спасибо (что у меня в очередной раз не бомбануло)
А вообще, проще по-моему сделать свою игру, чем нормальную карту в варкрафте -_-
Прикреплю торренты для нормального WC3. Также скачай JNPG:R с XGM, обнови pjass.exe и TESH.
Решение твое проблемы:
Ты делаешь кратер в точке X шириной Y и глубиной Z. Чтобы после его убрать, нужно сделать кратер в точке Х шириной Y и глубиной -Z.
Ещё есть такой момент: деревья в WC3 имеют также дополнительные облегчённые модели, без анимаций. Они импортируются по таком у же пути, что и исходная модель, но имеют вид <ИмяМодели>S.mdx и <ИмяМодели>D.mdx. Первая модель изображает живое дерево без анимаций, вторая — срубленное дерево (пень) без анимаций. Не знаю, можно ли без них обойтись, но имей в виду.
Но я не уверен, насколько это влияет на успех. Лучше сначала убедиться, что ошибка не кроется где-то ещё.
Я использовал такую модель для тумана. Просто белое свечение, ставил в качестве дудада, в редакторе объектов указывал оттенок (255,255,255 — белый, далее соответственно). С освещением ничего не сделаешь, да.
Ты можешь дать юниту предмет, в этот момент юнит получит все абилки из предмета. Если ты изменишь им уровень - параметры точно так же поменяются. Если выбросишь предмет - абилки с повышенными уровнями удаляться нормально.
Таким образом можно создать "Когти атаки (+6)", которые будут иметь абилку на +6/8/10 атаки. В нужный момент даёшь предмету 1 заряд, выбрасываешь его, и возвращаешь. При подборе смотришь сколько зарядов, если больше 0 - даёшь абилке уровень равный зарядам +1 (и повторять это каждый, когда предмет подбирается, т.к. уровни абилок за предметом не сохраняются). В итоге получаешь что-то вроде чарки / заточки предмета, без лишнего геморроя с заменой, но описание предмета будет неизменно, офк
Суть в том что нельзя регулировать уровень одинаковых абилок если "Когтей" несколько в инвентаре... нельзя напрямую. Можно выбросить предмет и дать его снова, тогда его абилки будут как бы последними в очереди... и ссылаясь на абилку можно регулировать уровень бонусов именно от последнего предмета...
меня не волнует уровень героя я хочу убрать этот предмет если их больше 2..уровень предмета то да..по другому я не вижу...вопрос в не в этом вопрос в том что увеличить а что убрать
пример взял отсюда
Item System
Events
Unit - A unit Acquires an item
Conditions
Actions
Set Item = 0
For each (Integer Slot_Integer) from 1 to 6, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Item level of (Item carried by (Hero manipulating item) in slot Slot_Integer)) Equal to (Item level of (Item being manipulated))
Then - Actions
Set Item = (Item + 1)
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Item Greater than 1
Then - Actions
Hero - Drop (Item being manipulated) from (Hero manipulating item)
Game - Display to (All players) for 5.00 seconds the text: Can't carry more th...
Else - Actions
решил вопрос....я проверял сколько предметов такого типа предмета и 2 убрал...написал так чтобы он понимал только этот тип предмета....теперь он правильно работает....надеюсь и другим этот триггер поможет в реализации..правда его надо доработать ну тем не менее
вот
Вот, слегка модифицировал твой вариант. Лучше, найти какую-нибудь готовую систему, ибо предметы всегда будут перемещаться, да и с полным инвентарем не корректно работает.
Tobi123, Нет, конечно не его, пустышка есть. Стоп, значит надо для всех один эффект и заклинание дать? Попробую. Audes, Но не на два же слова! Но тогда как увеличить это место? Tobi123, Попробовал, выносит, как только вхожу юнитом в зону действия ауры (Аура у здания).
Сделал через костыль - взял ауру "Торнадо (замедление)", обнулил все ее эффекты, сделал целью "сам воин" и поставил нужное заклинание. Но может, есть более изящные решения?
В принципе, ты сам сделал самое простое. Теоретически можно еще как-то через дамми-юнита заморочиться, но проще всего - то, что ты уже сделал.
» WarCraft 3 / Проблема с анимациями
» WarCraft 3 / Опыт для любого юнита (не героя)
» WarCraft 3 / Вопрос по модели...
» WarCraft 3 / Не работает мемхак
» WarCraft 3 / Проблема с москитами
» WarCraft 3 / Мапа не запускается.
» WarCraft 3 / По поводу ледяной брони Лича
» WarCraft 3 / Спецэффекты.
» WarCraft 3 / Ауры в статусе
» WarCraft 3 / Синхронизация.
» WarCraft 3 / Выделять юнита только триггерно
» WarCraft 3 / Как убрать утечку в этом триггере?
» WarCraft 3 / Тест на десинк.
» WarCraft 3 / vJass + cJass
» WarCraft 3 / Вопрос по триггерам.
» WarCraft 3 / Проверка способности
» WarCraft 3 / Способность на джасе
» WarCraft 3 / Ландшафт
» WarCraft 3 / Как поменять модель у разрушаемого объекта?
» WarCraft 3 / Освещение
» Администрация XGM / бан по железу
» WarCraft 3 / Уровень предмета
» WarCraft 3 / Как убрать иконки и эффекты